// Traitor v1.0.0
// traitor.txt
// by Kelandon (tomwatts@berkeley.edu) (Edited By SupaNik)
//
// Much like basicnpc, but if a flag is set, switches sides when it enters
// combat.
//
// Memory Cells:
//   Cell 0 - How creature moves.
//     0 - If 0, wander randomly. 
//     1 - Stands still until a target appears.
//     2 - Completely immobile, even if target appears.
//   Cell 1,2 - Stuff done flag. If both 0, nothing. Otherwise when this 
//     is killed, set to 1. (Example: If cell 1 is 3 and cell 2 is 5, when
//     creature is killed, sets SDF(3,5) to 1.)
//   Cell 3 - Dialogue node to start with if talked to. if left at 0, this
//     character doesn't talk.
//	 Cell 4,5 - SDF to change sides. If the flag is greater than a value defined
//		in memory cell 6, changes as soon as it sees the party.
//	 Cell 6 - Value that SDF must be higher than to change sides.
//	 Cell 7 - What to side to change to. The options:
//		0 - Friendly
//		1 - Neutral
//		2 - Hostile A
//		3 - Hostile B

begincreaturescript;

variables;

short i,target;
short has_changed = 0;

body;

beginstate INIT_STATE;
	if (get_memory_cell(0) == 2)
		set_mobility(ME,0);
	change_spell_level(ME,0,8,-2);
	alter_stat(ME,11,4);

break;

beginstate DEAD_STATE;
	// Set the appropriate stuff done flag for this character being dead
	if ((get_memory_cell(1) != 0) || (get_memory_cell(2) != 0))
		set_flag(get_memory_cell(1),get_memory_cell(2),1);
		message_dialog("Jessica falls down, dead. As she does, a small silver key falls from her robes. You quickly bend down and get it - it may come in handy.","");
		change_spec_item(1,1);
		break;

beginstate START_STATE; 
	if (has_changed == 0)
		if ((can_see_char(1000) == 1) && (get_flag(get_memory_cell(4),get_memory_cell(5)) > get_memory_cell(6)))
			{	message_dialog("You see Jessica again. Whilst before she was merely snappy with you, she clearly isn't happy to see you now. As soon as she sets eyes on you, she screams out, in a strange, strangled voice:","_You! You won't be allowed to stop me! I will be free! Let me be free! Please! I'll kill you! You won't get me!_");
				print_named_str(ME,"changes sides!");
			if (get_memory_cell(7) == 0)
				set_attitude(my_number(),3);
			if (get_memory_cell(7) == 1)
				set_attitude(my_number(),4);
			if (get_memory_cell(7) == 2)
				set_attitude(my_number(),10);
			if (get_memory_cell(7) == 3)
				set_attitude(my_number(),11);
			has_changed = 1;
			set_memory_cell(0,0);
			}
	
	// if I have a target for some reason, go attack it
	if (target_ok()) {
		if (dist_to_char(get_target()) <= 16)
			set_state(3);
			else set_target(ME,-1);
		}
	
	// Look for a target, attack it if visible
	if (select_target(ME,8,0)) {
		do_attack();
		set_state(3);
		}
		
	// Have I been hit? Strike back!
	if (who_hit_me() >= 0) {
		set_target(ME,who_hit_me());
		do_attack();
		set_state(3);
		}
		
	// Otherwise, just peacefully move around. Go back to start, if I'm too far
	// from where I started.
	if ((my_dist_from_start() >= 6) || ((my_dist_from_start() > 0) && (get_memory_cell(0) > 0))) {
		if (get_ran(1,1,100) < 40) 
			return_to_start(ME,1);
		}
		else if (get_memory_cell(0) == 0) {
			fidget(ME,25);
			}

	// if we're in combat and the above didn't give me anything to do, just
	// stop now. Otherwise, game will keep running script, and that eats up CPU time.
	if (am_i_doing_action() == FALSE)
		end_combat_turn();
break;

beginstate 3; // attacking
	if (has_changed == 0)
		if ((can_see_char(1000) == 1) && (get_flag(get_memory_cell(4),get_memory_cell(5)) > get_memory_cell(6)))
			{print_named_str(ME,"changes sides!");
			if (get_memory_cell(7) == 0)
				set_attitude(my_number(),3);
			if (get_memory_cell(7) == 1)
				set_attitude(my_number(),4);
			if (get_memory_cell(7) == 2)
				set_attitude(my_number(),10);
			if (get_memory_cell(7) == 3)
				set_attitude(my_number(),11);
			has_changed = 1;
			set_memory_cell(0,0);
			}
	if (target_ok() == FALSE)
		set_state(START_STATE);
	do_attack();
break;

beginstate TALKING_STATE;
	if(get_flag(1,18) == 0) {
		begin_talk_mode(get_memory_cell(3));
	} else {
		print_str("Talking: She doesn't respond.");
		end();
	}
break;